package common.util
{
	import mx.controls.DateField;
	import mx.formatters.DateFormatter;

	public class DateUtil
	{
		/**
		 * YYYY-MM-DD HH:NN:SS 格式
		 */ 
		public static const FORMAT_LONG_YYYY_MM_DD:String="YYYY-MM-DD HH:NN:SS";
		/**
		 * YYYY-MM-DD HH:NN 格式
		 */ 
		public static const FORMAT_LONG_HOUR_MINUTE:String ="YYYY-MM-DD HH:NN";
		/**
		 * YYYY-MM-DD 格式
		 */
		public static const FORMAT_YYYY_MM_DD:String="YYYY-MM-DD";
		/**
		 * YYYY 格式
		 */
		public static const FORMAT_YYYY:String="YYYY";
		
		//获取当前年份的最后一个数字字符串
		public static function getLastYearStr():String{
			var year:String = dateToStr(null,FORMAT_YYYY);
			return year.charAt(year.length);
		}
		
		//格式化日期字符串
		public static function formatDateStr(dateStr:String,formatStr:String=null):String{
			var df:DateFormatter = new DateFormatter();
			if(formatStr==null){
				df.formatString=FORMAT_YYYY_MM_DD;
			}else{
				df.formatString=formatStr;
			}
			return df.format(dateStr);
		}		
		
		
		/**
		 * 根据年月日，时间字符串创建日期
		 * @params year 年
		 * @params month 月
		 * @params day 日
		 * @params hour 时 默认0
		 * @params minute 分 默认0
		 * @params second 秒 默认0
		 */
		public static function createDateByStr(year:Number,month:Number,day:Number,hour:Number=0,minute:Number=0,second:Number=0):Date{
			//年月日
			var preDateStr:String = String(year).concat("-").concat(DateUtil.appendPreZero(month)).concat("-").concat(DateUtil.appendPreZero(day));
			//年月日+时分秒
			var dateStr:String = preDateStr.concat(" ").concat(DateUtil.appendPreZero(hour)).concat(":").concat(DateUtil.appendPreZero(minute)).concat(":").concat(DateUtil.appendPreZero(second));
			return DateUtil.strToDate(dateStr);
		}
		
		/**
		 * 传一个2009-12-04 或 2009-12-04 16:17:39类似日期字符串 转化为 日期对象
		 * 
		 * @params dateStr 日期字符串
		 */	
		public static function strToDate(dateStr:String):Date { 
			if ( dateStr == null ) { 
				return null; 
			} 
			var year:int = int(dateStr.substr(0,4)); 
			var month:int = int(dateStr.substr(5,2)); 
			var day:int = int(dateStr.substr(8,2)); 
			
			if ( year == 0 && month == 0 && day == 0 ) { 
				return null; 
			} 
			
			if ( dateStr.length == 10 ) { 
				return new Date(year, month-1, day); 
			} 
			
			var hour:int = int(dateStr.substr(11,2)); 
			var minute:int = int(dateStr.substr(14,2)); 
			var second:int = int(dateStr.substr(17,2)); 
			
			return new Date(year, month-1, day, hour, minute, second); 
		} 
		
		/**
		* 传入日期对象 转换为 类似2009-12-04 或 2009-12-04 16:17:39 或 2009-12-04 16:17 的字符串 默认为YYYY-MM-DD模式
		* 
		* @params mydate 传入日期对象
		* @params formatStr 传入格式化模式 默认为YYYY-MM-DD模式
		*/ 
		public static function dateToStr(mydate:Date=null,formatStr:String=null):String{
			var df:DateFormatter=new DateFormatter();
			if(mydate==null){
				mydate = new Date();
			} 
			if(formatStr){
				df.formatString=formatStr;
			}else{
				df.formatString=FORMAT_YYYY_MM_DD;
			}
			var str:String= df.format(mydate);
			return str;
		}
		
		/**
		 * 获取当前开始日期对象 转换为 类似2009-12-04 或 2009-12-04 16:17:39 或 2009-12-04 16:17的字符串 默认为YYYY-MM-DD模式
		 * 
		 * @params mydate 传入日期对象
		 * @params formatStr 传入格式化模式 默认为YYYY-MM-DD模式
		 */ 
		public static function beginDateToStrByNow(formatStr:String=null):String{
			var endFixStr:String;
			if(formatStr){
				if(formatStr==FORMAT_YYYY_MM_DD){
					endFixStr = "";
				}else if(formatStr==FORMAT_LONG_YYYY_MM_DD){
					endFixStr = " 00:00:00";
				}else if(formatStr==FORMAT_LONG_HOUR_MINUTE){
					endFixStr = " 00:00";
				}
			}else{
				endFixStr = " 00:00:00";
			}
			return dateToStr(null,FORMAT_YYYY_MM_DD).concat(endFixStr);
		}
		
		/**
		 * 获取当前结束日期对象 转换为 类似2009-12-04 或 2009-12-04 16:17:39 或 2009-12-04 16:17的字符串 默认为YYYY-MM-DD模式
		 * 
		 * @params mydate 传入日期对象
		 * @params formatStr 传入格式化模式 默认为YYYY-MM-DD模式
		 */ 
		public static function endDateToStrByNow(formatStr:String=null):String{
			return dateToStr(null,formatStr);
		}

		
		/**
		 * 如果传入指定日期,则给指定的日期加天数
		 * 如果未传入指定日期，则默认给当天的日期加天数
		 * @params mydate 传日日期对象
		 * @params day 传入需要增加的天数，如果是加1天则为1，如果是减天则为-1 
		 */
		public static function addDayByDate( mydate:Date=null,day:int=0):Date{ 
			var returnDate:Date;
			if(mydate){
			    returnDate = new Date(mydate.time); 
			}else{
				returnDate = new Date();
			}
			returnDate['date'] += day 
			return returnDate;    
		} 
		
		//当日期选择时控制日期选择范围
		public static function onDateChangeHandler(startDf:DateField,endDf:DateField,endMaxDate:Date=null):void  
		{  
			var startDate:Date = strToDate(startDf.text);//前一个日期控件显示的值
			var endDate:Date = strToDate(endDf.text);//后一个日期控件显示的值
			startDf.selectableRange = {rangeEnd:endDate};//前一个日期控件最大不能超过后一个日期控件选择的值
			startDf.selectedDate = startDate;
			
			var endDfRange:Object = new Object();//后一个日期控件最小不能超过前一个日期控件的选择值
			endDfRange.rangeStart = startDate;
			if(endMaxDate){
				endDfRange.rangeEnd = endMaxDate;
			}
			endDf.selectableRange = endDfRange;
			endDf.selectedDate = endDate;
		}       
		
		//获取两个日期相隔天数
		public static function diffDateNum(beginDate:String,endDate:String):Number{
			var num1:Number =	strToDate(beginDate).valueOf(); 
			var num2:Number =  strToDate(endDate).valueOf(); 
			var d1Days : int = int(num1/ 24 / 60 / 60 / 1000); 
			var d2Days : int = int(num2/ 24 / 60 / 60 / 1000); 
			var diffDay2:int = Math.abs(d1Days -d2Days) ;//方法2 
			return diffDay2;
		}
		
		//获取两个日期相隔年数
		public static function diffYearNum(beginDate:String,endDate:String):Number{
			if(!beginDate){
				return 0;
			}
			if(!endDate){
				var df:DateFormatter=new DateFormatter();
				df.formatString=FORMAT_YYYY_MM_DD;
				endDate = df.format(new Date());
			}
			var days:Number = diffDateNum(beginDate,endDate);
			return days/365;
		}
		
		//获取两个日期相隔小时
		public static function diffHourNum(beginDate:String,endDate:String):Number{
			var num1:Number =	strToDate(beginDate).valueOf(); 
			var num2:Number =  strToDate(endDate).valueOf(); 
			var d1Hour : int = int(num1/ 60 / 60 / 1000); 
			var d2Hour : int = int(num2/ 60 / 60 / 1000); 
			var diffHour:int = Math.abs(d1Hour -d2Hour) ;//方法2 
			return diffHour;
		}
		
		//获取两个日期相隔分钟
		public static function diffMinuteNum(beginDate:String,endDate:String):Number{
			var num1:Number =	strToDate(beginDate).valueOf(); 
			var num2:Number =  strToDate(endDate).valueOf(); 
			var d1Value : int = int(num1/ 60 / 1000); 
			var d2Value : int = int(num2/ 60 / 1000); 
			var diffValue:int = Math.abs(d1Value -d2Value) ;//方法2 
			return diffValue;
		}
		
		//获取日期相减的描叙
		public static function getDescDiffDate(beginDate:String,endDate:String):String{
			var num1:Number =	strToDate(beginDate).valueOf(); 
			var num2:Number =  strToDate(endDate).valueOf(); 
			var d1Value : int = int(num1/ 1000); 
			var d2Value : int = int(num2/ 1000); 
			var diffValue:int = Math.abs(d1Value -d2Value) ;//获取相差的秒钟
			return getTimeDesc(diffValue);
		}
		//获取时间长度的中文描述
		public static function getTimeDesc(seconds:Number):String{
			if(seconds == 0){
				return "0秒";
			}
			var castDay:int = int(seconds / (60 * 60 * 24));// 除一天的秒钟数
			var castHours:int = int((seconds % (60 * 60 * 24)) / (60 * 60));// 模一天的秒数再除一小时的秒钟
			var castMinute:int = int(((seconds % (60 * 60 * 24)) % (60 * 60)) / 60);// 模一天的秒钟数再模一小时的秒钟// 然后再除一分钟的秒
			var castSecond:int = int(((seconds % (60 * 60 * 24)) % (60 * 60)) % 60);// 模一天的秒钟数再模一小时的秒钟
			
			var desc:String = "";
			if(castDay != 0){
				desc = desc.concat(castDay).concat("天");
			}
			if(castHours != 0){
				desc = desc.concat(castHours).concat("时");
			}
			if(castMinute != 0){
				desc = desc.concat(castMinute).concat("分");
			}
			if(castSecond != 0){
				desc = desc.concat(castSecond).concat("秒");
			}
			return desc;
		}
		
		//创建时间
		public static function createTime(beginTimeH:Number,endTimeM:Number):String{
			var beginTime:String = appendPreZero(beginTimeH);
			var endTime:String = appendPreZero(endTimeM);
			return beginTime.concat(":").concat(endTime);
		}
		
		
		//日期拆分成数字
		public static function splitTime(time:String):Array{
			var arr:Array = time.split(':');
			var h:String = String(arr[0]);
			var m:String = String(arr[1]);
			var hrNum:Number = Number(deletePreZero(h));
			var mrNum:Number= Number(deletePreZero(m));
			var resultArr:Array = new Array();
			resultArr.push(hrNum);
			resultArr.push(mrNum);
			return resultArr;
		}
		
		/**
		 * 去除数字中多余的第一个0
		 * 
		 */
		public static function deletePreZero(str:String):String{
			if(str.length==2 && str.charAt(0)=='0'){
				str = str.charAt(1);
			}
			return str;
		}
		
		/**日期格式个数补0
		 * @param num
		 */
		public static function appendPreZero(num:Number):String{
			var tempNum:String;
			if(num<10){
				tempNum = "0"+String(num);
			}else{
				tempNum = String(num);
			}
			return tempNum;
		}			
		
		/**
		 * 带时分秒的时间比较大小
		 * @param num
		 */
		public static function compareTime(startDate:String,enddate:String):int{ 
			var myPattern1:RegExp=/-|:| /g; 
			var dateFormatter:DateFormatter = new DateFormatter();
			dateFormatter.formatString = FORMAT_LONG_YYYY_MM_DD;
			startDate=dateFormatter.format(startDate);
			startDate=startDate.replace(myPattern1,''); 
			
			enddate=dateFormatter.format(enddate);
			enddate=enddate.replace(myPattern1,''); 
 
			if(int(startDate)<=int(enddate)){ 
				return 1; 
			} else if(int(startDate) ==int(enddate)) 
			{ 
				return 0; 
			}else{
				return -1; 
			} 
		} 
		
		/**
		 * 获取某日期特定月份的天数
		 * @params date 指定日期
		 * @params monthValue 指定月份
		 */ 
		public static function getDaysByMonth(date:Date,monthValue:Number):Number{
			var MyDate:Date; 
			if(!date){
				MyDate= new Date();
			}else{
				MyDate = date;
			}
			var MyCurYear:Number = MyDate.getFullYear();
			var result:Number;
			if (monthValue==1 || monthValue==3 || monthValue==5 || monthValue==7 || monthValue==8 || monthValue==10 || monthValue==12){
				result = 31;
			}
			if( monthValue==4 || monthValue==6 || monthValue==9 || monthValue==11){
				result = 30;
			}
			
			if (monthValue == 2) {//如果是二月，判断是否为闰年
				if ((MyCurYear%4 == 0) && (MyCurYear%100 != 0) || (MyCurYear%400 == 0)) {
					result = 29; 
				} else {
					result =  28;
				}
			}
			return result;
		}
		
		//获取当月的第一天
		public static function getFirstDayOfMonth():String{
			var df:DateFormatter=new DateFormatter();
			df.formatString="YYYY-MM";
			return df.format(new Date())+"-01";
		}
	}
}